/**
 * 配置管理模块
 * 提供配置的本地存储、获取和同步功能
 */
class ConfigManager {
    constructor() {
        this.storageKey = 'vr-iot-config';
        this.defaultConfig = {
            language: 'zh-CN',
            theme: 'light',
            temperatureUnit: 'celsius',
            notifications: true,
            autoRefresh: true,
            lastSync: null
        };
        this.config = null;
        this.init();
    }

    /**
     * 初始化配置
     */
    init() {
        try {
            // 从localStorage加载配置，如果没有则使用默认配置
            const storedConfig = localStorage.getItem(this.storageKey);
            if (storedConfig) {
                this.config = { ...this.defaultConfig, ...JSON.parse(storedConfig) };
            } else {
                this.config = { ...this.defaultConfig };
                this.save();
            }
        } catch (error) {
            console.error('Failed to load config:', error);
            // 出错时使用默认配置
            this.config = { ...this.defaultConfig };
        }

        // 监听online/offline事件，在网络恢复时尝试同步配置
        window.addEventListener('online', () => this.trySyncConfig());
    }

    /**
     * 获取所有配置
     */
    getAll() {
        return { ...this.config };
    }

    /**
     * 获取单个配置项
     * @param {string} key 配置项名称
     * @param {*} defaultValue 默认值
     */
    get(key, defaultValue = null) {
        return this.config.hasOwnProperty(key) ? this.config[key] : defaultValue;
    }

    /**
     * 设置单个配置项
     * @param {string} key 配置项名称
     * @param {*} value 配置项值
     */
    set(key, value) {
        this.config[key] = value;
        this.save();
        return this;
    }

    /**
     * 批量设置配置项
     * @param {Object} newConfig 新的配置对象
     */
    setMultiple(newConfig) {
        this.config = { ...this.config, ...newConfig };
        this.save();
        return this;
    }

    /**
     * 保存配置到localStorage
     */
    save() {
        try {
            localStorage.setItem(this.storageKey, JSON.stringify(this.config));
            // 触发自定义事件，通知其他模块配置已更新
            window.dispatchEvent(new CustomEvent('configUpdated', { detail: { ...this.config } }));
            
            // 尝试同步配置到服务器（如果支持Service Worker和后台同步）
            this.requestSync();
        } catch (error) {
            console.error('Failed to save config:', error);
        }
    }

    /**
     * 重置配置为默认值
     */
    reset() {
        this.config = { ...this.defaultConfig };
        this.save();
        return this;
    }

    /**
     * 请求配置同步（使用Service Worker后台同步）
     */
    requestSync() {
        if ('serviceWorker' in navigator && 'SyncManager' in window) {
            navigator.serviceWorker.ready.then(registration => {
                registration.sync.register('sync-user-config')
                    .then(() => console.log('Sync registered'))
                    .catch(err => console.error('Sync registration failed:', err));
            });
        }
    }

    /**
     * 尝试同步配置
     */
    async trySyncConfig() {
        // 这里可以实现与服务器同步配置的逻辑
        // 在离线模式下，配置已经保存在本地，网络恢复时可以尝试同步到服务器
        this.config.lastSync = new Date().toISOString();
        this.save();
    }

    /**
     * 导出配置
     */
    exportConfig() {
        const dataStr = JSON.stringify(this.config, null, 2);
        const dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr);
        
        const exportFileDefaultName = `vr-iot-config-${new Date().toISOString().split('T')[0]}.json`;
        
        const linkElement = document.createElement('a');
        linkElement.setAttribute('href', dataUri);
        linkElement.setAttribute('download', exportFileDefaultName);
        linkElement.click();
    }

    /**
     * 导入配置
     * @param {File} file 配置文件
     */
    importConfig(file) {
        return new Promise((resolve, reject) => {
            const reader = new FileReader();
            reader.onload = (event) => {
                try {
                    const importedConfig = JSON.parse(event.target.result);
                    // 验证配置格式
                    if (typeof importedConfig === 'object') {
                        this.setMultiple(importedConfig);
                        resolve(this.getAll());
                    } else {
                        reject(new Error('Invalid configuration format'));
                    }
                } catch (error) {
                    reject(error);
                }
            };
            reader.onerror = () => reject(new Error('Failed to read file'));
            reader.readAsText(file);
        });
    }
}

// 创建单例实例
const configManager = new ConfigManager();

// 导出
export default configManager;
export { ConfigManager };